package com.boil.qz.safekavass.web.controller;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.model.LoginUser;
import com.boil.qz.safekavass.service.LoginUserService;
import com.boil.util.BaseController;
import com.boil.util.Constants;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Created by ChenYong on 2017-04-15.
 * 登录控制器。
 */
@Controller
@RequestMapping("/web")
public class LoginController extends BaseController {
    /**
     * 重定向到首页的 URL
     */
    private static final String REDIRECT_INDEX_URL = "redirect:/web/index.html";
    /**
     * 注入后台用户 Service
     */
    @Autowired
    private LoginUserService loginUserService;

    /**
     * 登录页。
     *
     * @param model 模型
     * @return 登录页-“/jsp/login.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/login.html")
    public String login(Model model) {
        // 获取登录用户的操作信息
        Subject subject = SecurityUtils.getSubject();
        // 获取 Session
        Session session = subject.getSession();

        // 如果用户已经登录了，重新刷登录界的话，我们就给他返回主界面
        if (subject.isAuthenticated()) {
            return REDIRECT_INDEX_URL;
        }

        // 登录超时
        Integer sessionTimeout = (Integer) session.getAttribute(Constants.SESSION_TIMEOUT);

        if ((sessionTimeout != null) && (Constants.LOGIN_TIMEOUT == sessionTimeout)) {
            // 结果 VO
            ResultVo resultVo = new ResultVo();
            resultVo.setResultCode(Constants.LOGIN_TIMEOUT);
            resultVo.setResultMsg(Constants.LOGIN_TIMEOUT_MSG);

            model.addAttribute(Constants.RESULT_VO, resultVo);

            // 从 Session 中移除 Session 失效的标记
            session.removeAttribute(Constants.SESSION_TIMEOUT);
        }

        return "/login";
    }

    /**
     * 登录验证。
     *
     * @param model   模型
     * @param account 账号
     * @param passwd  密码
     * @return <ol>
     * <li>登录成功，首页-“/jsp/index.jsp”；</li>
     * <li>登录失败，登录页-“/jsp/login.jsp”。</li>
     * </ol>
     */
    @RequestMapping(method = RequestMethod.POST, value = "/login.html")
    public String doLogin(Model model, String account, String passwd) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取 Shiro 登录验证失败的信息
        String shiroLoginFailure = (String) request.getAttribute(Constants.SHIRO_LOGIN_FAILURE);

        loginUserService.doLogin(resultVo, shiroLoginFailure, account);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        // 登录失败
        return "/login";
    }

    /**
     * 退出系统。
     *
     * @param model 模型
     * @return 登录页-“/jsp/login.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/logout.html")
    public String logout(Model model) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取登录用户
        Subject subject = SecurityUtils.getSubject();

        // 如果用户已登录
        if (subject.isAuthenticated()) {
            // 获取 Session
            Session session = subject.getSession();
            // 获取登录用户
            LoginUser loginUser = (LoginUser) session.getAttribute(Constants.LOGIN_USER);

            resultVo.setResult(loginUser.getLoginid());
            resultVo.setResultCode(Constants.LOGOUT);
            resultVo.setResultMsg(Constants.LOGOUT_MSG);

            model.addAttribute(Constants.RESULT_VO, resultVo);

            // 退出系统（！！！非常关键）
            subject.logout();

            log.info("账号：{}--->退出系统", loginUser.getLoginid());
        }

        return "/login";
    }
}